在这篇文章中,我们将带领您了解Objective-C2.0withCocoaFoundation---NSObject的奥秘(1)的全貌,包括objective-c入门的相关情况。同时,我们还将为您介
在这篇文章中,我们将带领您了解Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)的全貌,包括objective-c入门的相关情况。同时,我们还将为您介绍有关angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])、ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript、NSObject类现在是Objective-C运行时库的一部分(而不是Foundation组件)吗?、Objective-C 2.0 with Cocoa Foundation - (Hello word-1)的知识,以帮助您更好地理解这个主题。
本文目录一览:- Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)(objective-c入门)
- angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])
- ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript
- NSObject类现在是Objective-C运行时库的一部分(而不是Foundation组件)吗?
- Objective-C 2.0 with Cocoa Foundation - (Hello word-1)
Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)(objective-c入门)
objecsive-C从本质上来说,还是C语言的。那么内部究竟是怎样实现SEL,Class和IMP,还有封装和继承的?为了解答这个问题,笔者决定在本章向大家概要的介绍一下objecsive-C的最主要的一个类,NSobjecs。
不过说实在话,如果同学们觉得本章的内容比较晦涩难懂的话,不阅读本章的内容丝毫不会对写程序产生任何不良的影响,但是如果掌握了本章的内容的话,对加深对objecsive-C的理解,对于今后笔者将要讲述的内容而言,将会是一个极大的促进。
6.1,本章程序的执行结果
在本章里面,我们将要继续使用我们在前面几章已经构筑好的类Cattle和Bull。由于在现在的Xcode版本里面,把一些重要的东西比如说Class的原型定义都放到了LIB文件里面,所以这些东西的具体的定义,对于我们来说是不可见的。
我们首先把第4章的代码打开,然后打开“Cattle.h” 文件,把鼠标移动到“NSobjecs”上面,单击鼠标右键,在弹出菜单里面选择“Jump to DeFinition”。然后会弹出一个小菜单,我们选择“interface NSobjecs” 。我们可以看到如下代码
@interface NSobjecs {
Class isa;
我们知道了,所谓的NSobjecs里面只有一个变量,就是Class类型的isa。isa的英文的意思就是is a pointer的意思。也就是说NSobjecs里面只有一个实例变量isa。好的,我们需要知道Class是一个什么东西,我们把鼠标移动到“Class”上面,单击鼠标右键,在弹出菜单里面选择“Jump to DeFinition”,我们看到了如下的代码:
typedef struct objc_class *Class;
typedef struct objc_objecs {
Class isa;
} *id;
...
我们在这里知道了,Class实际上是一个objc_class的指针类型,我们把鼠标移动到“objc_class”上面,单击鼠标右键,在弹出菜单里面选择“Jump to DeFinition”,发现我们还是在这个窗口里面,Xcode并没有把我们带到objc_class的定义去,所以我们无从知道objc_class内部究竟是一个什么样的东西。
笔者顺便提一下,大家也许注意到了id的定义,id实际上是objc_objecs结构的一个指针,里面只有一个元素那就是Class。那么根据上面我们看到的,所谓的id就是objc_class的指针的指针。让我们回忆一下下面的代码:
id cattle = [Cattle new];
这句话是在初始化和实例话cattle对象,这个过程,实际上可以理解为,runtime为我们初始化好了Class的指针,并且把这个指针返回给我们。我们初始化对象完成了之后,实际上我们得到的对象就是一个指向这个对象的Class指针。
让我们在回过头来说说这个神秘的Class,我们无法在Xcode里面看到Class也就是objc_class的定义。庆幸的是这部分的定义是GCC代码,是开源的。笔者下载了开源的代码之后,把开源的代码作了一些小小的调整,然后把Class的定义等等放到了我们的工程文件里面去,通过类型转化之后,我们终于可以看到Class,SEL,还有isa等等过去对我们来说比较“神秘”的东西的真正面目。
我们在前面几章里面在每一个章的第一节里面都要介绍一下本章程序执行结果的屏幕拷贝,本章也是一样,但是本章的执行结果非常简单。因为对于本章而言重点应该是放在对NSobjecs机制的理解上。
angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])
Can’t resolve all parameters for AuthenticationService: ([object Object],?,[object Object])
我已经检查了几乎每个主题,并尝试了多种方法来解决它,但仍然无法在第二天击败它.
我试图像这样在appService中注入第一个authService但是得到了同样的错误
@Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService
我检查了所有DI和服务内部的导入顺序,在我看来一切都是正确的
如果有人可以帮我处理它,我很感激.
Angular 4.0.0
AuthService
import { Injectable } from '@angular/core'; import {Http,Headers,Response} from '@angular/http'; import 'rxjs/add/operator/toPromise'; import {Observable} from 'rxjs/Rx'; import {AppServices} from "../../app.services"; import {Router} from "@angular/router"; @Injectable() export class AuthenticationService { public token: any; constructor( private http: Http,private appService: AppServices,private router: Router ) { this.token = localStorage.getItem('token'); } login(username: string,password: string): Observable<boolean> { let headers = new Headers(); let body = null; headers.append("Authorization",("Basic " + btoa(username + ':' + password))); return this.http.post(this.appService.api + '/login',body,{headers: headers}) .map((response: Response) => { let token = response.json() && response.json().token; if (token) { this.token = token; localStorage.setItem('Conform_token',token); return true; } else { return false; } }); } logout(): void { this.token = null; localStorage.removeItem('Conform_token'); this.router.navigate(['/login']); } }
应用服务
import {Injectable} from '@angular/core'; import {Headers,Http,RequestOptions} from '@angular/http'; import {Router} from "@angular/router"; import {AuthenticationService} from "./auth/auth.service"; import 'rxjs/add/operator/toPromise'; import {Observable} from 'rxjs/Rx'; @Injectable() export class AppServices { api = '//endpoint/'; public options: any; constructor( private http: Http,private router: Router,public authService: AuthenticationService // doesn't work // @Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService // doesn't work either ) { let head = new Headers({ 'Authorization': 'Bearer ' + this.authService.token,"Content-Type": "application/json; charset=utf8" }); this.options = new RequestOptions({headers: head}); } // ==================== // data services // ==================== getData(): Promise<any> { return this.http .get(this.api + "/data",this.options) .toPromise() .then(response => response.json() as Array<Object>) .catch((err)=>{this.handleError(err);}) }
应用模块
import { browserModule } from '@angular/platform-browser'; import { browserAnimationsModule } from '@angular/platform-browser/animations'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import {BaseRequestOptions,HttpModule} from '@angular/http'; import { MaterialModule} from '@angular/material'; import {FlexLayoutModule} from "@angular/flex-layout"; import 'hammerjs'; import { routing,appRoutingProviders } from './app.routing'; import { AppServices } from './app.services'; import {AuthGuard} from "./auth/auth.guard"; import {AuthenticationService} from "./auth/auth.service"; import {AppComponent} from './app.component'; import {AuthComponent} from './auth/auth.component'; import {NotFoundComponent} from './404/not-found.component'; import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent,AuthComponent,NotFoundComponent,HomeComponent ],imports: [ browserModule,browserAnimationsModule,FormsModule,HttpModule,routing,MaterialModule,FlexLayoutModule ],providers: [AppServices,AuthGuard,AuthenticationService],bootstrap: [AppComponent] }) export class AppModule { }
解决方法
你可以使用
export class AuthenticationService { public token: any; appService: AppServices; constructor( private http: Http,// private appService: AppServices,injector:Injector; private router: Router ) { setTimeout(() => this.appService = injector.get(AppServices)); this.token = localStorage.getItem('token'); }
另见DI with cyclic dependency with custom HTTP and ConfigService
要避免使用setTimeout,您还可以从AppService的构造函数中设置AuthenticationService.appService(或者相反)
ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript
我发现它的概念非常有趣.它似乎主要是语法糖,看起来很可读.
虽然它不直接编译到Objective-C,但它声称生成与Objective-C相同的二进制代码
Eero compiles down to the same binary code as Objective-C
Eero offers excellent,nearly seamless interoperability with
Objective-C,C,and C++.
我发现这种方法非常有趣,我想知道是否有类似的编程语言和项目提供与Objective-C和iOS的大腿集成.
我正在为Objective-C寻找类似Coffeescript的东西.
解决方法
它确实需要记录在一个更明显的地方……
NSObject类现在是Objective-C运行时库的一部分(而不是Foundation组件)吗?
但是,Mountain Lion之前的ObjC运行时库的版本没有实现NSObject类(它们没有NSObject.mm文件,例如你可以在Mac OS X 10.7’s Objective-C runtime library source code看到).
那么这是否真的意味着NSObject类现在是Objective-C运行时库的一部分而不是Foundation库组件?如果是,为什么?在继承NSObject时,是否要避免连接整个Foundation库(使用-framework Foundation)?
解决方法
如果你在libobjc上运行它,你会发现NSObject实际上是由libobjc提供的:
% nm /usr/lib/libobjc.dylib | grep -F NSObject ⋮ 0000000000021688 t +[NSObject _isDeallocating] 0000000000021674 t +[NSObject _tryRetain] 0000000000021780 t +[NSObject allocWithZone:] 000000000002176e t +[NSObject alloc] 0000000000021699 t +[NSObject allowsWeakReference] 0000000000021712 t +[NSObject autorelease] 0000000000020fa6 t +[NSObject class] 000000000002115a t +[NSObject conformsToProtocol:] 00000000000217ea t +[NSObject copyWithZone:] 00000000000217e6 t +[NSObject copy] 000000000002178d t +[NSObject dealloc] ⋮
(“t”表示符号由此库提供;“u”表示符号未定义,表示此库使用它,但它必须来自其他位置.)
这不是他们第一次提出NSObject的实施;在Lion中,你会在CoreFoundation.framework中找到它.
我不知道为什么他们动了它.无论如何,它是一个实现细节;正式,NSObject is still part of Foundation.
Objective-C 2.0 with Cocoa Foundation - (Hello word-1)
2.1,构筑Hello,World
第一步,启动Xcode。初次启动的时候,也许会弹出一个“Welcome to Xcode”的一个对话框。这个对话框和我们的主题没有关系,我们可以把它关掉。
第二步,选择屏幕上部菜单的“File->New Project”,出现了一个让你选择项目种类的对话框。你需要在对话框的左边选择“Command Line Utility” ,然后在右边选择“Foundation Tool”,然后选择“Choose...”按钮。如图2.1所示。
图2-1,新建项目
注意
也许有人会问,你不是要讲解iphone的开发,那么为什么不选择“iPhone OS”下面的“Application”呢?
是这样的,在这个系列当中,笔者主要侧重于objecsive-C的语法的讲解,为了使得讲解简单易懂,清除掉所有和要讲解的内容无关的东西,所以笔者在这里只是使用最简单的命令行。
第三步,Xcode会提问你项目的名字,在“Save As”里面输入“02-Hello World”,然后选择“Save”。如图2-2所示
图2-2,输入项目的名字
第四步,得到一个如图2-3所示的一个画面。尝试一下用鼠标分别点击左侧窗口栏里面的“02-Hello World”,“Source”.“Documentation”,“External Frameworks and Libraries”,“Products”,然后观察一下右边的窗口都出现了什么东西。一般来说,“02-Hello World”就是项目的名字下面是项目所有的文件的列表。项目下面的子目录分别是和这个项目相关的一些虚拟或者实际上的目录。为什么我说是虚拟的呢?大家可以通过Finder打开你的工程文件的目录,你会发现你的所有文件居然都在根目录下,根本就不存在什么“Source”之类的目录。
图2-3,项目浏览窗口
第五步,选择屏幕上方菜单的“Run”然后选择“Console”,出现了如图2-4所示的画面,用鼠标点击窗口中间的“Build and Go”按钮。
图2-4,运行结果画面
如果不出什么意外的话,大家应该看到我们熟悉得不能再熟悉的“Hello Wolrd!” 。由于我们没有写任何的代码,所以从理论上来说,这部分代码不应该出现编译错误。好的,从下面开始,笔者要开始对这个Hello World里面的一些新鲜的东西进行讲解。
关于Objective-C 2.0 with Cocoa Foundation---NSObject的奥秘(1)和objective-c入门的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于angular – 无法解析AuthenticationService的所有参数:([object Object],?,[object Object])、ios – 是否有编译为Objective-C或与Objective-C二进制兼容的语言 – > Objective-C的Coffeescript、NSObject类现在是Objective-C运行时库的一部分(而不是Foundation组件)吗?、Objective-C 2.0 with Cocoa Foundation - (Hello word-1)等相关知识的信息别忘了在本站进行查找喔。
本文标签: