目前我正在为我的第一个Objective-c API做出一些决定.没什么大不了的,只是帮助我自己将来更快地完成任务.
在阅读了几个小时关于不同模式,比如制作类别,单身等等之后,我遇到了一些我喜欢的东西,因为它对我来说似乎很容易维护.我正在制作一套有用的功能,这些功能在任何地方都很有用.
所以我做的是:
1)我创建了两个新文件(.h,.m),并为"class"命名:SLUtilsMath,SLUtilsGraphics,SLUtilsSound等.我认为这是一种"命名空间",所以所有这些东西总是被称为SLUtils******.我将它们全部添加到Group SL中,其中包含一个子组SLUtils.
2)然后我只将函数签名放在.h文件中,并在.m文件中实现函数.猜猜看:它有效!! 我很高兴它,它很容易使用.关于它的唯一令人讨厌的事情是,我每次需要时都必须包含适当的标题.但那没关系,因为那是正常的.不过,我可以将它包含在头文件前缀pch文件中.
然后,我去了厕所,一个幽灵出现在那里,说:"嘿!制作真正的方法而不是函数是不是更好?你不应该制作类方法,所以你必须调用一个方法而不是而不是一个功能?是不是更酷,是不是有更好的表现?" 好吧,为了便于阅读,我更喜欢这些功能.另一方面,他们没有像方法那样的"命名参数",afaik.
那么在那种情况下你更喜欢什么?
当然我不想在使用有用的方法或函数之前分配对象.那将是痛苦的.
也许厕所鬼是对的.有一个更酷的方式.嗯,对我个人而言,这很棒:
MYNAMESPACECoolMath.h
#import <Foundation/Foundation.h>
@interface MYNAMESPACECoolMath : NSObject {
}
+ (float)randomizeValue:(float)value byPercent:(float)percent;
+ (float)calculateHorizontalGravity:(CGPoint)p1 andPoint:(CGPoint)p2;
// and some more
@end
Run Code Online (Sandbox Code Playgroud)
然后在代码中,我只需导入MYNAMESPACECoolMath.h并调用:
CGFloat myValue = [MYNAMESPACECoolMath randomizeValue:10.0f byPercent:5.0f];
没有讨厌的实例化,初始化,分配,什么永远.对我来说,这个模式在java中看起来像一个静态方法,非常好用且易于使用.
据我所知,功能优于代码的可读性更高.在查看CGRectMake(10.0f,42.5f,44.2f,99.11f)时,您可能需要查看这些参数的含义,如果您对它不熟悉的话.但是当您使用"命名"参数进行方法调用时,您会立即看到参数是什么.
我认为,当谈到可以在任何地方使用的简单有用的方法/功能时,我错过了对单例类产生重大影响的观点.制作特殊类型的随机值不属于任何东西,它是全局的.像草一样.像树一样.像空气一样.每个人都需要它.
我想访问一个整数和一个字符串从一个类到所有其他类?最好的方法是什么?我想在程序中的任何位置增加值,然后想要在声明的类中更新它们....
任何想法如何实现这一点???
我有一个简单的客观c对象
NSManagedObjectContext * moc = nil
现在我需要将它传递给接受类型参数的ARC环境中的函数
void *volatile * value
我试过了
&((__bridge void *)moc))
但是我得到以下编译器错误
Address expression must be lvalue or a function pointer
我也试过了
void ** addr = (__bridge void **)(&moc);
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误
Incompatible types casting 'NSManagedObjectContext * __strong *' to 'void **' with a __bridge cast
有没有办法先进行转换然后获取转换指针的地址?
编辑
更具体地说,我正在尝试实现另一个stackoverflow问题中描述的单例模式,但是我无法NSManagedObjectContext在ARC环境中将目标c 对象的地址输入到以下函数的第三个参数中.
OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, void *volatile *__theValue)
我在应用程序的几个地方使用单例模式,并且clang在分析代码时出现内存泄漏错误.
static MyClass *_sharedMyClass;
+ (MyClass *)sharedMyClass {
@synchronized(self) {
if (_sharedMyClass == nil)
[[self alloc] init];
}
return _sharedMyClass;
}
// clang error: Object allocated on line 5 is no longer referenced after this point and has a retain count of +1 (object leaked)
Run Code Online (Sandbox Code Playgroud)
我正在使用这些设置scan-build:
scan-build -v -v -v -V -k xcodebuild
我非常肯定单例中的代码很好 - 毕竟,它与Stack Overflow以及Apple的文档中引用的代码相同 - 但我希望将内存泄漏警告整理出来以便我的扫描 - 建立回报成功.
我有一个类,其中包含一些需要从另一个类调用的实例方法.我知道怎么做 -
TimeFormatter *myTimeFormatter = [[TimeFormatter alloc] init];
[myTimeFormatter formatTime:time];
Run Code Online (Sandbox Code Playgroud)
但是,每次我需要调用其中一个方法时,我不希望必须分配和初始化TimeFormatter.(我需要从另一个类中的各种方法调用TimeFormatter的方法).
我尝试过
TimeFormatter *myTimeFormatter = [[TimeFormatter alloc] init];
Run Code Online (Sandbox Code Playgroud)
"本身",或者不在任何块中,但是当我编译时,我得到一个"初始化元素不是常量"错误.
任何输入都非常感谢!
在应用程序委托中创建的大多数情况下的托管对象上下文.将它传递给视图/控制器层次结构的方法有哪些,因此树中的每个导航/选项卡控制器都可以访问它.每次从父母到孩子的传递都可能不是最好的,因为我每次都必须携带这些信息,有时不是所有的控制器都可能需要它.
这是viewDidLoad中fetchRequest的代码,代码遵循这里的教程,只是我以编程方式链接导航控制器和tableview,而不是使用界面构建器.实体ProductInfo存在.但是,当我运行程序时,我收到错误:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'ProductInfo''
Run Code Online (Sandbox Code Playgroud)
我已经重置模拟器,因为它是一个旧模型,但错误仍然发生.我也切换到使用FetchedResultsController,但问题仍然存在.问题是因为这些fetchedResultsController方法不在appdelegate中?它们目前位于TableViewController中.我怎么解决这个问题?
viewDidLoad方法:
- (void)viewDidLoad{
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"ProductInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError * error;
self.productInfos = [_context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
[super viewDidLoad];}
Run Code Online (Sandbox Code Playgroud)
ProductInfo.h:
@class ProductDetails;
@interface ProductInfo : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * productName;
@property (nonatomic, retain) NSString * productPrice;
@property (nonatomic, retain) …Run Code Online (Sandbox Code Playgroud) 我有一段代码调用方法返回NSMutableArray如下:
+(NSMutableArray *)method {
NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil];
return rgb;
}
Run Code Online (Sandbox Code Playgroud)
它每次被叫时都会泄漏.放下[rgb release];后return似乎不起作用.放在它之前return使我的应用程序崩溃.同时加入autorelease使我的应用程序崩溃.建议?
美好的一天,朋友们.
从新手回来关于Obj-C的愚蠢问题:)
我正在尝试在Obj-C中实现单例设计模式:
@interface SampleSingleton : NSObject {
@private
static SampleSingleton* instance;
}
+(SampleSingleton*) getInstance;
Run Code Online (Sandbox Code Playgroud)
编译器返回错误:"在'静态'之前的预期说明符 - 限定符列表".
在我的班级甲板我有
static Deck *gInstance = NULL;
+(Deck *) instance {
@synchronized(self) {
if (gInstance == NULL)
gInstance = [[self alloc] init];
}
return (gInstance);
}
Run Code Online (Sandbox Code Playgroud)
和一个看起来像的init方法
-(id) init {
if (gInstance != NULL) {
return self;
}
self = [super init];
if (self) {
// Lots of clever things
}
gInstance = self;
return self;
}
Run Code Online (Sandbox Code Playgroud)
我在这里关心的主要是是否init正确实施.如果我写的内容适合你,请告诉我.
或者...有没有办法让我init私密并阻止人们(包括我自己)完全看到它?