是什么区别self.myVariable = obj;
和myVariable = obj;
,当我使用@propery
/ @synthesize
创建`MYVARIABLE?
所以我有一个协议,需要声明一个属性:
@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
Run Code Online (Sandbox Code Playgroud)
以及符合它的对象:
@interface MyViewController : NSViewController <MyProtocol>
@end
Run Code Online (Sandbox Code Playgroud)
但是,如果我在实现文件(类扩展)中声明属性(在协议中指定):
@interface MyViewController()
@property MyView *myView;
@end
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
在类扩展"MyViewController"中非法重新声明属性(属性必须为'readwrite',而其主要必须为'readonly')
似乎有两个主要的SO线程解决这个问题:
属性必须是readwrite,而它的主要必须是只读的
,
不能声明另一个窗口
第一个答案没有解释任何事情
第二个答案说你可以通过声明标题内的属性来绕过这个错误; 唉
头
@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
Run Code Online (Sandbox Code Playgroud)
履行
@interface MyViewController()
@end
Run Code Online (Sandbox Code Playgroud)
这构建没有错误.
我也知道,当你声明一个@property
协议的内部时,它不会自动合成.
因此,如果我想将@property
声明保留在实现中,我将不得不这样@synthesize
做.这也有效.
所以我的问题是,为什么声明@property
标题内部与实现文件有关,如果@property
最初在协议内声明?
没有协议,我认为唯一的区别是@property
公共或私人.但显然,如果@property
在头文件和实现文件中声明a ,则还会发生/不会发生其他事情
鉴于下面的属性声明,方法(A)的工作方式与方法(B)完全相同吗?我只想检查self.yellowViewController = yellcon_New;
是通过我的setter进行的,以便释放旧对象并保留新对象.
// INTERFACE
@property(nonatomic, retain) YellowViewController *yellowViewController;
// IMPLEMENTATION (A)
self.yellowViewController = yellcon_New;
// IMPLEMENTATION (B)
[self setYellowViewController:yellcon_New];
Run Code Online (Sandbox Code Playgroud) Objective-C提供运行时反射功能.我正在尝试查找声明属性的getter/setter选择器名称.我知道像field
/ 这样的基本规则setField:
.无论如何,我认为运行时反射应该提供一个功能来解析完整抽象的名称,但我找不到该功能.
如何在Objective-C中解析带有运行时反射的声明属性的getter/setter方法选择器(而不是实现)(实际上是Apple的Cocoa)
或反向查询.(方法选择器→声明的属性)
我正在浏览Xcode 4.4的发行说明并注意到这一点:
LLVM 4.0编译器
Xcode现在包含Apple LLVM Compiler 4.0版,包括以下newObjective-C语言功能:
- 默认@synthesize:未实现时自动合成@property
我对这个功能很感兴趣.它是如何工作的?我试过删除它@synthesize
,它不起作用.
为什么在最新版本的Xcode(dp-4)中声明retain,nonatomic
的变量是在变量名称之前使用下划线?这是否会产生某种类型的安全性?
例如,我创建了一个属性:
@property (retain, nonatomic) IBOutlet UILabel *name;
Run Code Online (Sandbox Code Playgroud)
除非我改变里面的变量dealloc
而没有_,否则我必须这样做:
@synthesize name = _name;
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我正在使用performSelector:
,它返回一个id
对象,以调用其他几个方法.这些方法的返回类型实际上可以是某个BOOL
,int
,NSDate
或任何其他类型的对象.
我如何判断返回的对象是否performSelector:
是BOOL
?我尝试将其转换为NSNumber
等等,但如果对象不是a,则会崩溃BOOL
.
我有一个具有以下属性的类:
@property(retain,nonatomic) NSString* A;
@property(assign,nonatomic) BOOL B;
@property(retain,nonatomic) NSArray* C;
@property(assign,nonatomic) int64_t D;
Run Code Online (Sandbox Code Playgroud)
这个类是由框架生成的,所以我无法改变它.但是,我要循环A
,B
,C
,D
调用每个属性和检索数据.但是,正如您所看到的,返回类型可能会有所不同,我需要调整它.
我正在做类似的事情:
SEL s = NSSelectorFromString(@"A");
id obj = [object performSelector:s];
//check if obj is BOOL
//do something with obj
Run Code Online (Sandbox Code Playgroud) 我读了这个问题(和其他几个):
我完全理解(至少我希望如此:-D)属性的原子/非原子说明符如何工作:
原子保证"读"操作不会被"写"操作中断.Nonatomic不保证这一点.
无论是原子还是非原子解决竞争条件,其中一个线程正在读取并且两个线程正在写入.无法预测读取操作将返回的结果.这需要通过额外的同步来解决.
原子和非原子都不能保证整体数据的完整性; 一个线程可以设置一个属性,而另一个线程设置第二个属性,该状态与第一个属性的状态不一致.这也需要通过额外的同步来解决.
令我眉毛的是,人们分为两个阵营:
Pro atomic:nonatomic
仅用于性能优化是有意义的.
如果你没有优化,那么你应该总是使用原子因为第1点.这样你在多线程应用程序中读取这个属性时就不会得到一些完整的废话.当然,如果您关心第2点和第3点,则需要在其上添加更多同步.
反对原子:完全使用原子是没有意义的.
由于原子并不能解决多线程应用程序中的所有问题,因此根本不需要使用它,因为无论如何都需要在它上面添加更多的同步代码.它会让事情变得更慢.
我倾向于亲原子营,但我想做一个理智的检查,我没有错过任何东西.
在所谓的"Modern Objective-C"之前,当在类别中创建新属性时,我们需要实现setter和getter方法.现在,我们没有必要这样做@synthesize
; 编译器将自动创建方法和实例变量.
但通常情况下,我们无法将实例变量添加到类别中,那么如果我们在具有现代Objective-C的类别中添加新属性会发生什么?编译器是否为我们创建了一个ivar?
我的类有一个BOOL
需要由另一个类设置的属性,所以我试图使用指针.我正在为此声明一个属性:
@interface SomeClass : SuperClass
{
BOOL *_shared;
}
@property(nonatomic) BOOL *shared;
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?然后我只需设置并访问这样的值:
*self.shared = YES;
Run Code Online (Sandbox Code Playgroud)
或者是将其设置为可保留属性的正确方法?
encapsulation objective-c instance-variables declared-property
objective-c ×10
cocoa ×3
atomicity ×1
cocoa-touch ×1
llvm ×1
protocols ×1
reflection ×1
syntax ×1
xcode ×1